package com.kws.system.util;

import java.io.*;
import java.util.Base64;
import java.util.UUID;

public class ImgBase64Util {
	/**
	 * @Description: 图片转换为base64编码
	 */
	public static String ImageToBase64(String imgFileLocation) {
		// 获取图片的类型
		String imgType = imgFileLocation.substring(
				imgFileLocation.lastIndexOf(".") + 1, imgFileLocation.length());
		InputStream in = null;
		byte[] data = null;

		// 读取图片字节数组
		try {
			in = new FileInputStream(imgFileLocation);
			data = new byte[in.available()];
			in.read(data);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		// 对字节数组Base64编码
		Base64.Encoder encoder = Base64.getEncoder();
		// 将图片类型拼接在base64编码的头部，如果不拼接，base64编码保存为图片时，则统一保存为jpg类型的图片
		String imgBase64Head = "data:image/" + imgType + ";base64,";
		return imgBase64Head + encoder.encodeToString(data);
	}

	/**
	 * 
	 * @param imgBase64
	 *            图片的base64编码
	 * @param imgSaveLocation
	 *            图片的保存路径
	 * @Description: 将base64编码转换为图片
	 */
	public static void Base64ToImage(String imgBase64, String imgSaveLocation) {
		FileOutputStream write = null;
		try {
			String pic_base64 = imgBase64; // 获取图片的base64编码
			String picLocation = imgSaveLocation; // 图片存在本地的位置
			String pic_type = "jpg"; // 默认图片格式
			/*
			 * 如果传来的base64编码带有包含图片类型的头部信息"data:image/png;base64,"，则根据该头部信息获取图片类型，
			 * 否则默认保存为jpg格式
			 */
			if (pic_base64.indexOf("data:image/") != -1) {
				// 从编码后的头部信息获取图片类型
				pic_type = pic_base64.substring(11, pic_base64.indexOf(";"));
				// 如果包含，则将字符串从上面的字符之后进行截取
				pic_base64 = pic_base64.substring(pic_base64.indexOf(",") + 1);
			}

			Base64.Decoder decoder = Base64.getDecoder();
			byte[] picByte = decoder.decode(pic_base64);
			String picName = UUID.randomUUID().toString().replace("-", "")
					+ "." + pic_type; // 使用UUID和图片类型拼接图片名
			// 图片保存在本地的路径，如果目录不存在，则创建目录
			File dir = new File(picLocation);
			if (!dir.exists()) {
				dir.mkdirs();
			}
			write = new FileOutputStream(new File(picLocation + picName));
			write.write(picByte);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (write != null) {
				try {
					write.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}
